package com.tom.architect02.ui10.day01;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;

import com.tom.architect02.R;

// 自定义组件 TextView
public class TextView extends View {
    private String mText;
    private int mTextSize = 15;
    private int mTextColor = Color.BLACK;
    private Paint mPaint;

    // 代码中 new 的时候调用
    public TextView(Context context) {
        this(context, null);
    }

    // 在布局layout中使用
    public TextView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }
    // 不会自动调用，API>21才能使用。如有默认style时，在第二个构造函数中调用。
    public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    /**
     * 统一样式。
     * <style name="default">
     * <item name="layout_width"></item>
     * <item name="layout_height"></item>
     * <style/>
     * <com.darren.view_day1.TextView
     * style=@"style/default"
     * android:text="Welcome"/>
     */
    // 在layout中使用，使用了style。调用第三个构造方法。但是会有style
    // 不会自动调用，如有默认style时，在第二个构造函数中调用。
    public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // 获取自定属性
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TextView);
        mText = array.getString(R.styleable.TextView_darrenText);
        mTextColor = array.getColor(R.styleable.TextView_darrenTextColor, mTextColor);
        mTextSize = array.getDimensionPixelSize(R.styleable.TextView_darrenTextSize, sp2px(mTextSize));
        array.recycle();

        mPaint = new Paint();
        mPaint.setAntiAlias(true); // 抗锯齿
        mPaint.setTextSize(mTextSize);
        mPaint.setColor(mTextColor);
        //  默认给一个透明的背景
        // setBackgroundColor(Color.TRANSPARENT);
        setWillNotDraw(false);
    }

    private int sp2px(int sp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,
                getResources().getDisplayMetrics());
    }

    // 自定义的测量方法，指定控件的宽高
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        // 1. 确定的值，不需要计算
        int width = MeasureSpec.getSize(widthMeasureSpec);
        // 2.wrap_content 需要计算, 宽度（与字体长度、字体大小有关），用画笔来测量
        if (widthMode == MeasureSpec.AT_MOST) {
            Rect bounds = new Rect();
            // 获取文本的rect
            mPaint.getTextBounds(mText, 0, mText.length(), bounds);
            width = bounds.width() + getPaddingLeft() + getPaddingRight(); // 宽度考虑padding值
        }

        int height = MeasureSpec.getSize(heightMeasureSpec);
        if (heightMode == MeasureSpec.AT_MOST) {
            Rect bounds = new Rect();
            mPaint.getTextBounds(mText, 0, mText.length(), bounds);
            height = bounds.height() + getPaddingTop() + getPaddingBottom();
        }
        setMeasuredDimension(width, height); // 设置控件的宽高，让父容器measureChild 能拿到值。
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 画文字 text  x  y  paint
        // x 就是开始的位置   0
        // y 基线 baseLine   求？   getHeight()/2知道的   centerY

        //dy 代表的是：高度的一半到 baseLine的距离
        Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
        // top 是一个负值  bottom 是一个正值.  bottom的值代表是  bottom是baseLine到文字底部的距离（正值）
        // 必须要清楚的，可以自己打印就好：
        // dy = 中心线 到 基线的距离.
        int dy = (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom;
        int baseLine = getHeight()/2 + dy; // 中心点centerY = getHeight()/2；
        int x = getPaddingLeft();
        canvas.drawText(mText, x, baseLine, mPaint); // baseLine文字绘制的基线
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return super.onTouchEvent(event);
    }
}
